#ifndef STATECHANGED_HH_
# define STATECHANGED_HH_
# include "Network.hh"
# include "GameMessage.hh"
# include "../World/World.hh"
# include "../World/Planet/Task.hh"
# include "../Geom/Vector.hh"

/**
 * <game>
 *  <state_changed>
 *      <stars>
 *          <star>
 *              <id>azonosító</id>
 *              <pos>
 *                  <x>x koordináta</x>
 *                  <y>y koordináta</y>
 *              </pos>
 *              <planets>
 *                  <planet>
 *                      <id>azonosító</id>
 *                      <size>méret</size>
 *                      <owner>tulajdonos neve</owner>?
 *                      <population>népesség</population>?
 *                      <food>raktározott élelem</food>?
 *                      <dwelling>lakóházak</dwelling>?
 *                      <factory>gyárak</factory>?
 *                      <farm>farmok</farm>?
 *                      <reactor>erőművek</reactor>?
 *                      <queue>
 *                          <task>
 *                              <product>mit gyárt</product>
 *                              <amount>hány darabot</amount>
 *                          </task>+
 *                      </queue>?
 *                  </planet>*
 *              </planets>
 *          </star>+
 *      </stars>
 *      <players>
 *          <player>
 *              <name>játékos neve</name>
 *              <money>a játékos pénze</money>?
 *              <fleets>
 *                  <fleet>
 *                      <id>azonosító</id>
 *                      <pos>
 *                          <x>x koordináta</x>
 *                          <y>y koordináta</y>
 *                      </pos>
 *                      <battleship>csatahajók</battleship>?
 *                      <fighter>vadászok</fighet>?
 *                      <colonyship>kolonizáló hajól</colonyship>?
 *                      <transportship>szállító hajók</transportship>?
 *                      <tank>tankok</tank>?
 *                      <commands>
 *                          parancsok listája, XML
 *                      </commands>?
 *                  </fleet>*
 *              </fleets>
 *          </player>+
 *      </players>
 *  </state_changed>
 * </game>
 */
class Network::StateChanged: public GameMessage {
    public: struct TaskInfo {
        QString product;
        u8 amount;

        TaskInfo();
        TaskInfo(World::Planet::Task const& task);
        TaskInfo(QDomElement const& taskElem);

        void to_xml(QDomNode& parent) const;
    };

    /**
     * \brief Bolygó információk.
     *
     * Oda-vissza konvertálható XML-be.
     */
    public: struct PlanetInfo {
        u1      id;
        u8      size;
        QString owner;
        QVector<TaskInfo> tasks;
        u8 population;
        u8 food;
        u8 dwelling;
        u8 factory;
        u8 farm;
        u8 reactor;
        u8 fighter;
        u8 tank;

        PlanetInfo();
        PlanetInfo(World::Planet const& planet);
        PlanetInfo(QDomElement const& planetElem);

        void to_xml(QDomNode& parent) const;
    };

    /**
     * \brief Flotta információk.
     *
     * Oda-vissza konvertálható XML-be.
     */
    public: struct FleetInfo {
        u8                 id;
        Geom::Vector< f8 > position;
        u8                 battleship;
        u8                 fighter;
        u8                 colonyship;
        u8                 transportship;
        u8                 tank;

        FleetInfo(World::Fleet const& fleet);
        FleetInfo(QDomElement const& fleetElem);

        void to_xml(QDomNode& parent) const;
    };

    public: struct PlayerInfo {
        typedef QMap< u8, FleetInfo > FleetMap;

        QString  name;
        u8       money;
        FleetMap fleets;

        PlayerInfo();
        PlayerInfo(World::Player const& player);
        PlayerInfo(QDomElement const& playerElem);

        void to_xml(QDomNode& parent) const;
    };

    /**
     * \brief Csillag információk.
     *
     * Oda-vissza konvertálható XML-be.
     */
    public: struct StarInfo {
        typedef QVector< PlanetInfo > PlanetList;

        u8                 id;
        Geom::Vector< f8 > position;
        PlanetList         planets;

        StarInfo();
        StarInfo(World::Star const& star);
        StarInfo(QDomElement const& starElem);

        void to_xml(QDomNode& parent) const;
    };

    /**
     * \brief Galaxis információk.
     *
     * Oda-vissza konvertálható XML-be.
     */
    public: struct GalaxyInfo {
        typedef QMap< QString, PlayerInfo > PlayerMap;
        typedef QMap< u8,      StarInfo   > StarMap;

        PlayerMap players;
        StarMap stars;

        GalaxyInfo(World::Galaxy const& galaxy);
        GalaxyInfo(QDomElement const& galaxyElem);
        void to_xml(QDomNode& parent) const;
    };

    public: static spStateChanged construct(QDomElement const& message);
    public: GalaxyInfo const galaxyInfo;
    public: explicit StateChanged(GalaxyInfo const& galaxy);
    public: explicit StateChanged(World::Galaxy const& galaxy);
    public: virtual QDomDocument to_xml() const;
    public: virtual void process_on_client(XmlClient& client);
};

#endif // ndef STATECHANGED_HH_
